package be.teletask.onvif.parsers;

import be.teletask.onvif.models.OnvifMediaProfile;
import be.teletask.onvif.responses.OnvifResponse;

import be.teletask.onvif.responses.VideoSourceConfiguration;
import be.teletask.onvif.util.XmlToJsonUtils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Tomas Verhelst on 04/09/2018.
 * Copyright (c) 2018 TELETASK BVBA. All rights reserved.
 */
public class GetMediaProfilesParser extends OnvifParser<List<OnvifMediaProfile>> {

    //Constants
    public static final String TAG = GetMediaProfilesParser.class.getSimpleName();
    private static final String KEY_PROFILES = "Profiles";
    private static final String KEY_VIDEO_SOURCE = "VideoSourceConfiguration";
    private static final String KEY_EXTENSION = "Extension";
    private static final String ATTR_TOKEN = "token";
    private static final String ATTR_NAME = "Name";

    @Override
    public List<OnvifMediaProfile> parse(OnvifResponse response) {
        List<OnvifMediaProfile> profiles = new ArrayList<>();
        JSONObject bodyObjet = XmlToJsonUtils.xmlToJson(response.getXml());

        JSONArray profilesArray = bodyObjet.getJSONObject("GetProfilesResponse").getJSONArray("Profiles");

        for (int i = 0; i < profilesArray.size(); i++) {
            // 获取每个JSONObject
            JSONObject profile = profilesArray.getJSONObject(i);

            String profileToken = profile.getString("@token");
            String profileName = profile.getString("Name");
            String videoSourceToken="",videoSourceName="",
                    audioOutputToken="",audioOutputName="",
                    audioDecoderToken="", audioDecoderName="";
            if(profile.containsKey("VideoSourceConfiguration")) {
                videoSourceToken = profile.getJSONObject("VideoSourceConfiguration").getString("@token");
                videoSourceName = profile.getJSONObject("VideoSourceConfiguration").getString("Name");
            }

            if(profile.containsKey("Extension")) {
                if(profile.getJSONObject("Extension").containsKey("AudioDecoderConfiguration")) {
                    audioDecoderToken = profile.getJSONObject("Extension").getJSONObject("AudioDecoderConfiguration").getString("@token");
                    audioDecoderName = profile.getJSONObject("Extension").getJSONObject("AudioDecoderConfiguration").getString("Name");
                }
                if(profile.getJSONObject("Extension").containsKey("AudioOutputConfiguration")) {
                    audioOutputToken = profile.getJSONObject("Extension").getJSONObject("AudioOutputConfiguration").getString("@token");
                    audioOutputName = profile.getJSONObject("Extension").getJSONObject("AudioOutputConfiguration").getString("Name");
                }
            }
            profiles.add(new OnvifMediaProfile(profileName, profileToken,
                    videoSourceName,videoSourceToken,
                    audioOutputName, audioOutputToken,
                    audioDecoderName, audioDecoderToken));
        }

//        try {
//            getXpp().setInput(new StringReader(response.getXml()));
//            eventType = getXpp().getEventType();
//            while (eventType != XmlPullParser.END_DOCUMENT) {
//                if (eventType == XmlPullParser.START_TAG) {
//                    String tagName = getXpp().getName();
//                    if (KEY_PROFILES.equals(tagName)) {
//                        // 获取trt:Profiles的token属性
//                        String profilesToken = getXpp().getAttributeValue(null, ATTR_TOKEN);
//                        String profilesName = "",videoSourceToken="",videoSourceName="",
//                                audioOutputToken="",audioOutputName="",
//                                audioDecoderToken="", audioDecoderName="";
//
//                        // 跳过trt:Profiles的开始标签
//                        eventType = getXpp().next();
//
//                        // 现在我们处于trt:Profiles的子元素中
//                        while (!(eventType == XmlPullParser.END_TAG && !getXpp().getName().equals(KEY_PROFILES))) {
//                            tagName = getXpp().getName();
//                            if (eventType == XmlPullParser.START_TAG) {
//                                if (ATTR_NAME.equals(tagName)) {
//                                    // 获取Stream_101
//                                    eventType = getXpp().next(); // 移动到TEXT
//                                    profilesName = getXpp().getText();
//                                    eventType = getXpp().nextTag(); // 这将尝试读取下一个START_TAG或END_TAG
//                                } else if (KEY_VIDEO_SOURCE.equals(tagName)) {
//                                    // 获取VideoSourceToken_1
//                                    videoSourceToken = getXpp().getAttributeValue(null, ATTR_TOKEN);
//
//                                    // 跳过tt:VideoSourceConfiguration的开始标签
//                                    eventType = getXpp().nextTag(); // 这将跳过任何空的标签（如自闭合标签）
//
//                                    // 检查tt:Name（如果存在）
//                                    if (eventType == XmlPullParser.START_TAG && ATTR_NAME.equals(getXpp().getName())) {
//                                        eventType = getXpp().next(); // 移动到TEXT
//                                        videoSourceName = getXpp().getText();
//                                        // 这里可以处理videoSourceName，但看起来你不需要它
//                                        // 回到循环的下一轮
//                                        eventType = getXpp().nextTag(); // 这将尝试读取下一个START_TAG或END_TAG
//                                    }
//                                    // 注意：我们在这里没有显式地处理tt:VideoSourceConfiguration的结束标签，
//                                    // 因为我们依赖于外部循环来检测trt:Profiles的结束。
//                                }else if (KEY_EXTENSION.equals(tagName)) {
//                                    eventType = getXpp().next();
//                                    while (!(eventType == XmlPullParser.END_TAG && !getXpp().getName().equals(KEY_EXTENSION))) {
//                                        tagName = getXpp().getName();
//                                        if (eventType == XmlPullParser.START_TAG) {
//                                            if ("AudioOutputConfiguration".equals(tagName)) {
//                                                audioOutputToken = getXpp().getAttributeValue(null, ATTR_TOKEN);
//
//                                                // 跳过tt:VideoSourceConfiguration的开始标签
//                                                eventType = getXpp().nextTag(); // 这将跳过任何空的标签（如自闭合标签）
//
//                                                // 检查tt:Name（如果存在）
//                                                if (eventType == XmlPullParser.START_TAG && ATTR_NAME.equals(getXpp().getName())) {
//                                                    eventType = getXpp().next(); // 移动到TEXT
//                                                    audioOutputName = getXpp().getText();
//                                                    // 这里可以处理videoSourceName，但看起来你不需要它
//                                                    // 回到循环的下一轮
//                                                    eventType = getXpp().nextTag(); // 这将尝试读取下一个START_TAG或END_TAG
//                                                }
//                                            }else if ("AudioDecoderConfiguration".equals(tagName)) {
//                                                audioDecoderToken = getXpp().getAttributeValue(null, ATTR_TOKEN);
//
//                                                // 跳过tt:VideoSourceConfiguration的开始标签
//                                                eventType = getXpp().nextTag(); // 这将跳过任何空的标签（如自闭合标签）
//
//                                                // 检查tt:Name（如果存在）
//                                                if (eventType == XmlPullParser.START_TAG && ATTR_NAME.equals(getXpp().getName())) {
//                                                    eventType = getXpp().next(); // 移动到TEXT
//                                                    audioDecoderName = getXpp().getText();
//                                                    // 这里可以处理videoSourceName，但看起来你不需要它
//                                                    // 回到循环的下一轮
//                                                    eventType = getXpp().nextTag(); // 这将尝试读取下一个START_TAG或END_TAG
//                                                }
//                                            }else {
//                                                eventType = getXpp().next(); // 继续遍历
//                                            }
//                                        }
//                                    }
//                                }else {
//                                    eventType = getXpp().next(); // 继续遍历
//                                }
//                            }
//                            eventType = getXpp().next(); // 继续遍历
//                        }
//                        // 在这里，我们已经处理完了trt:Profiles的所有子元素
//                        // 可以将profilesToken和streamName（如果适用）添加到某个对象中
//                        // 但请注意，streamName可能需要根据实际情况进行调整
//                        profiles.add(new OnvifMediaProfile(profilesName, profilesToken,
//                                videoSourceName,videoSourceToken,
//                                audioOutputName, audioOutputToken,
//                                audioDecoderName, audioDecoderToken));
//                    }
//                }
//
//                eventType = getXpp().next(); // 继续遍历整个文档
//            }
//            while (eventType != XmlPullParser.END_DOCUMENT) {
//                if (eventType == XmlPullParser.START_TAG && getXpp().getName().equals(KEY_PROFILES)) {
//                    String token = getXpp().getAttributeValue(null, ATTR_TOKEN);
//                    getXpp().nextTag();
//                    if (getXpp().getName().equals(ATTR_NAME)) {
//                        getXpp().next();
//                        String name = getXpp().getText();
//                        profiles.add(new OnvifMediaProfile(name, token));
//                    }
//                }
//                eventType = getXpp().next();
//            }
//        } catch (XmlPullParserException | IOException e) {
//            e.printStackTrace();
//        }

        return profiles;
    }

}
